<?php if(!defined('IN_WDPHP'))exit('No direct script access.');
/**
 * WDPHP自动创建目录文件
 * @package 		WDPHP
 * @author 			肖伟 
 * @version 		v1.0
 * @copyright 		Copyright (c) 2012. widuu.com
 * @description     第一次加载系统时执行
 */


	class Filecreate{
		static $mess=array();
		/*
		 *创建文件
		 *@param string $filename 需要创建的文件名
		 *@param string $str	  需要向文件中写入的字符串
		 */
		static function createfile($filename,$str){
			if(!file_exists($filename)){
				if(file_put_contents($filename,$str)){
					self::$mess[]="创建文件{$filename}成功.";
				}
			}
		}
		/*
		 *创建目录
		 *@param string $dirs  需要创建的目录才名称
		 */
		 static function mkdir($dirs){
			foreach($dirs as $dir){
				if(!file_exists($dir)){
					if(mkdir($dir,"0755")){
						self::$mess[]="创建目录{$dir}成功";
					}
				}
			}
		 }
		 /*
		  *创建系统运行时的文件
		  */
		  static function runtime(){
			$dirs=array(
				__ROOT__."Runtime/Cache/", //系统缓存目录
				__ROOT__."Runtime/Cache/".TPL_STYLE,  //系统的缓存目录
				__ROOT__."Runtime/Compile/", //模板组合文件
				__ROOT__."Runtime/Compile/".TPL_STYLE,//模板组合文件
				__ROOT__."Runtime/Compile/".TPL_STYLE."/".TMP_PATH, //模板组合文件
				__ROOT__."Runtime/Data/", //数据表的结构文件
				__ROOT__."Runtime/Action/", 
				__ROOT__."Runtime/Action/wd_".TMP_PATH,
				__ROOT__."Runtime/Models/", 
				__ROOT__."Runtime/Models/wd_".TMP_PATH,
			);
		    self::mkdir($dirs);  
		  }
		/*
		 *创建项目的目录结构
		 */
		static function create(){
			self::mkdir(array(__ROOT__."Runtime/"));
			//文件锁，生成之后不能再创建
		    $structFile=__ROOT__."Runtime/".str_replace("/","_",$_SERVER["SCRIPT_NAME"]);  //主入口文件名
			if(!file_exists($structFile)){
				$filename=__ROOT__."config.inc.php";
				$str=<<<st
<?php 
	define("DEBUG",1);					//是否开启调试模式
	define("SQLTYPE","pdo");			//选择数据库的驱动
	define("HOST","localhost");			//数据库主机
	define("DB_USER","root");			//数据库用户名
	define("DB_PASS","");				//数据库密码
	define("DB_NAME","wdphp");			//数据库名
	define("DB_PREFIX","wd_");			//数据库前缀
	define("TPL_PREFIX", "tpl");		//默认模板后缀名
	define("TPL_STYLE","default");		//默认模板的存放位置
	define("CSTART",false);				//设置是否开始缓存,开启为true,不开启为false
	define("CTIME","");					//设置缓存时间,必须开启缓存时才能设置

st;
		self::createfile($filename,$str);
		if(!defined("DEBUG")){
				include $filename;
					}
		$dirs=array(
			__ROOT__."Class/",		//项目的自定义类
			__ROOT__."Common/",     //用户自定义函数目录
			__ROOT__."Public/",		//系统公共目录
			__ROOT__."Public/uploads/", //系统公共上传文件地址
			__ROOT__."Public/css/",		//系统公共的css目录
			__ROOT__."Public/js/",		//系统共用js目录
			__ROOT__."Public/images/" ,  //系统共用image
			APP_PATH,                   //当前的应用目录
			APP_PATH."/Models/",         //当前应用的模型目录
			APP_PATH."/Action/",       //当前应用的控制器目录
			APP_PATH."/Templets/",          //当前应用的视图目录
			APP_PATH."/Templets/".TPL_STYLE, //当前应用的模板目录
			APP_PATH."/Templets/".TPL_STYLE."/public/",           //公用模板目录
			APP_PATH."/Templets/".TPL_STYLE."/data/",        //当前应用模板公用资源目录
			APP_PATH."/Templets/".TPL_STYLE."/data/css/",     //当前应用模板CSS目录
			APP_PATH."/Templets/".TPL_STYLE."/data/js/",      //当前应用模板js目录
			APP_PATH."/Templets/".TPL_STYLE."/data/images/"  //当前应用模板图标目录
		);
		self::mkdir($dirs);	
$str=<<<st
<?php

		//这个是全局调用的函数库，自定义方法都写在这里
		function exmaple(){
				echo "这是一个事例";
		}
st;
	
		self::createfile(__ROOT__."Common/functions.php",$str);
		$success=APP_PATH."/Templets/".TPL_STYLE."/public/success.".TPL_PREFIX;
		$indexc=APP_PATH."/Action/Index.class.php";
		if(!file_exists($success))
			copy(WDPHP."/Common/success",$success);
			copy(WDPHP."/Common/index.class",$indexc);
			mkdir(APP_PATH."/Templets/".TPL_STYLE."/index");
			copy(WDPHP."/Common/wdphp",APP_PATH."/Templets/".TPL_STYLE."/index/index.".TPL_PREFIX);
			
			$str=<<<st
<?php
	class Common extends Action{
			function index(){
				
			}
	}
st;
		self::createfile(APP_PATH."/Action/Common.class.php",$str);
		// $str=<<<st
		// <?php
		// class Index {
			// function index(){
				
			// }
		// }
		// st;
		// self::createfile(__ROOT__."action/index.class.php",$str);
		self::createfile($structFile, "框架搭建成功，谢谢使用WDPHP");
		}
		self::runtime();
	}


		/*
		 * 父类控制器的生成
		 * @param	string	$srcbasepath	原基类控制器的路径
		 * @param	string	$conbasepath		目标基类控制器的路径
		 */ 
	
		static function commoncontroler($srcbasepath,$conbasepath){
			$srccommon=$srcbasepath."common.class.php";
			$common=$conbasepath."common.class.php";
			if(!file_exists($common)||filemtime($srccommon)>filemtime($common)){
				copy($srccommon,$common);
			}
		 }
		static function action($srccontrolerfile,$controlerpath,$m){
			$controlerfile=$controlerpath.strtolower($m)."action.class.php";
			//如果新控制器不存在， 或原控制器有修改就重新生成
			if(!file_exists($controlerfile) || filemtime($srccontrolerfile) > filemtime($controlerfile)){
				//将控制器类中的内容读出来
				$classContent=file_get_contents($srccontrolerfile);	
				//看类中有没有继承父类
				$super='/extends\s+(.+?)\s*{/i'; 
				//如果已经有父类
				if(preg_match($super,$classContent, $arr)) {
					$classContent=preg_replace('/class\s+(.+?)\s+extends\s+(.+?)\s*{/i','class \1Action extends \2 {',$classContent);
					//新生成控制器类
					file_put_contents($controlerfile, $classContent);
				//没有父类时
				}else{ 
					//继承父类Common
					$classContent=preg_replace('/class\s+(.+?)\s*{/i','class \1Action extends Common {',$classContent);
					//生成控制器类
					file_put_contents($controlerfile,$classContent);	
				}
			}
		}
			static function model($className, $app){
			$driver="Db".SQLTYPE; //父类名
			$path=__ROOT__."Runtime/Models/wd_".TMP_PATH;
			if($app==""){
				$src=APP_PATH."/Models/".strtolower($className).".class.php";
				$psrc=APP_PATH."/Models/___.class.php";
				$className=ucfirst($className).'Model';
				$parentClass='___model';
				$to=$path.strtolower($className).".class.php";
				$pto=$path.$parentClass.".class.php";
				
			}else{
				$src=__ROOT__.$app."/Models/".strtolower($className).".class.php";
				$psrc=__ROOT__.$app."/Models/___.class.php";
				$className=ucfirst($app).ucfirst($className).'Model';
				$parentClass=ucfirst($app).'___model';
				$to=$path.strtolower($className).".class.php";
				$pto=$path.$parentClass.".class.php";
			}

			
			//如果有原model存在
			if(file_exists($src)) {	
				$classContent=file_get_contents($src);											     $super='/extends\s+(.+?)\s*{/i'; 
				//如果已经有父类
				if(preg_match($super,$classContent, $arr)) {
					$psrc=str_replace("___", strtolower($arr[1]), $psrc);
					$pto=str_replace("___", strtolower($arr[1]), $pto);
					
					if(file_exists($psrc)){
						if(!file_exists($pto) || filemtime($psrc) > filemtime($pto)){
							$pclassContent=file_get_contents($psrc);
							$pclassContent=preg_replace('/class\s+(.+?)\s*{/i','class '.$arr[1].'Model extends '.$driver.' {',$pclassContent);
				
							file_put_contents($pto, $pclassContent);
				
						}
				
					}else{
						Debug::addmsg("<font color='red'>文件{$psrc}不存在!</font>");
					} 
					$driver=$arr[1]."Model";
					include_once $pto;
				}
				if(!file_exists($to) || filemtime($src) > filemtime($to) ) {	
					$classContent=preg_replace('/class\s+(.+?)\s*{/i','class '.$className.' extends '.$driver.' {',$classContent);
					//生成model
					file_put_contents($to,$classContent);
				}	
			}else{
				if(!file_exists($to)){
					$classContent="<?php\n\tclass {$className} extends {$driver}{\n\t}";
					//生成model
					file_put_contents($to,$classContent);	
				}	
			}

			include_once $to;
			return $className;
		}

	}